package net.jgrm.jetcache.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

/**
 * JetCache 配置属性类
 * 支持标准 JetCache 配置格式
 *
 * @author jgrm
 */
@Data
@ConfigurationProperties(prefix = "jetcache")
public class JetCacheProperties {

    /**
     * 是否启用JetCache
     */
    private boolean enabled = true;

    /**
     * 统计间隔时间（分钟）
     */
    private Integer statIntervalMinutes = 15;

    /**
     * 是否在缓存名称中包含区域
     */
    private Boolean areaInCacheName = false;

    /**
     * 本地缓存配置映射
     */
    @NestedConfigurationProperty
    private Map<String, LocalCacheConfig> local = new HashMap<>();

    /**
     * 远程缓存配置映射
     */
    @NestedConfigurationProperty
    private Map<String, RemoteCacheConfig> remote = new HashMap<>();

    /**
     * 本地缓存配置类
     */
    @Data
    public static class LocalCacheConfig {
        /**
         * 缓存类型 (caffeine)
         */
        private String type = "caffeine";

        /**
         * 键转换器
         */
        private String keyConvertor = "fastjson2";

        /**
         * 最大缓存条数
         */
        private Integer limit = 1000;

        /**
         * 默认过期时间（毫秒）
         */
        private Duration defaultExpireInMillis;

        /**
         * 写入后过期时间（毫秒）
         */
        private Long expireAfterWriteInMillis;
    }

    /**
     * 远程缓存配置类
     */
    @Data
    public static class RemoteCacheConfig {
        /**
         * 缓存类型 (redis.lettuce)
         */
        private String type = "redis.lettuce";

        /**
         * 键前缀
         */
        private String keyPrefix = "jetcache";

        /**
         * 键转换器
         */
        private String keyConvertor = "fastjson2";

        /**
         * 值编码器
         */
        private String valueEncoder = "java";

        /**
         * 值解码器
         */
        private String valueDecoder = "java";

        /**
         * 默认过期时间（毫秒）
         */
        private Duration defaultExpireInMillis;

        /**
         * 写入后过期时间（毫秒）
         */
        private Long expireAfterWriteInMillis;

        /**
         * 广播通道名称（用于本地缓存同步）
         */
        private String broadcastChannel;
    }


    // 兼容性方法，保持旧接口可用
    public String getCacheType() {
        return "both"; // 默认返回both类型
    }

    public boolean isEnableMethodCache() {
        return true;
    }

    public boolean isHidePackages() {
        return true;
    }

    // 为了兼容监控服务，提供简化的本地和远程配置访问
    public LocalCacheConfig getLocal() {
        return local.getOrDefault("default", new LocalCacheConfig());
    }

    public RemoteCacheConfig getRemote() {
        return remote.getOrDefault("default", new RemoteCacheConfig());
    }
}